from django.db import models

# Create your models here.

# 导入
from django.db import models
from django.contrib.auth.models import AbstractUser
from itsdangerous import TimedJSONWebSignatureSerializer, BadData
from django.conf import settings


# 重写用户模型类， 继承AbstractUser
class User(AbstractUser):
    """自定义用户模型类"""
    # 自带的用户模型类没有mobile字段，额外增加
    mobile = models.CharField(
        max_length=11,
        unique=True,
        verbose_name='手机号码'
    )
    email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态')
    class Meta:
        db_table = 'tb_users'
        verbose_name = "用户"
        verbose_name_plural = verbose_name

    def __str__(self):

        return self.username

    # python模块：itsdangerous（生成临时身份令牌）
    # 使用itsdangerous生成临时身份令牌
    # 调用 itsdangerous 中的类,生成对象
    # 有效期: 1天
    def generate_verify_email_url(self):
        """
        生成邮箱验证链接
        ：parm user: 当前登录用户
        :return: verify_url
        """
        serializer = TimedJSONWebSignatureSerializer(
            settings.SECRET_KEY,
            expires_in=60 * 60 * 24
        )
        # 拼接参数
        data = {'user_id': self.id, 'email': self.email}
        # 加密生成 token 值, 这个值是 bytes 类型, 所以解码为 str:
        token = serializer.dumps(data).decode()
        # 拼接URL
        verify_url = settings.EMAIL_VERIFY_URL + token

        # 返回
        return verify_url
    def check_verify_email_token(token):
        """
        验证token并提取user
        :param token:用户信息签名后的结果
        :return: user，None
        """
        # 调用itsdangerous类生成对象
        serializer = TimedJSONWebSignatureSerializer(
            settings.SECRET_KEY,
            expires_in=60 * 60 * 24
        )

        try:
            # 解析传入的token值，获取数据data
            data= serializer.loads(token)
        except BadData:
            # 如果传入的token中没有值，报错返回None
            return None
        else:
            # 如果有值
            user_id = data.get('user_id')
            email = data.get('email')
        try:
            # 获取到值之后, 尝试从 User 表中获取对应的用户
            user = User.objects.get(
                id=user_id,
                email=email
            )
        except Exception as e:
            # 如果用户不存在, 则返回 None
            return None
        else:
            # 如果存在则直接返回
            return user





























